package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.common.CustomException;
import com.itheima.dao.SetMealDao;
import com.itheima.dto.SetmealDto;
import com.itheima.pojo.Dish;
import com.itheima.pojo.Setmeal;
import com.itheima.pojo.SetmealDish;
import com.itheima.service.SetMealDishService;
import com.itheima.service.SetMealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class SetMealServiceImpl extends ServiceImpl<SetMealDao, Setmeal>
                implements SetMealService {

    @Autowired
    private SetMealDishService setMealDishService;

    @Override
    @Transactional //新增套餐的方法
    public void saveWithDish(SetmealDto setmealDto) {
        //1 对套餐的基本信息进行保存
        this.save(setmealDto);

        //2 获取套餐关联的菜品集合，并为集合中的每一个元素赋值套餐ID(setmealId)
        List<SetmealDish> list = setmealDto.getSetmealDishes();
        list.stream().map((item)->{
            item.setSetmealId(setmealDto.getId());
            return item;
        }).collect(Collectors.toList());
        /*for (SetmealDish setmealDish : list) {
            setmealDish.setSetmealId(setmealDto.getId());
        }*/

        //3 对套餐和菜品的关联信息进行保存 -> 批量保存套餐关联的菜品集合
        setMealDishService.saveBatch(list);
    }

    @Override
    @Transactional // 定义删除套餐的方法 -> 删除套餐数据也要同时删除与之关联的菜品数据
    public void removeSetMeal(List<Long> ids) {
        //1 创建条件构造器
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();

        //2 添加查询条件 -> 对套餐的状态进行查询 -> 套餐的起售状态为"1"
        queryWrapper.in(Setmeal::getId,ids).eq(Setmeal::getStatus,1);

        //3 对套餐的状态进行判定,确定是否可以删除 -> 套餐只有处于停售状态才可以被删除
        int count = this.count(queryWrapper);
        if (count > 0){
            //不能被删除,则抛出一个异常
            throw new CustomException("套餐售卖中,删除失败");
        }

        //4 停售状态 -> 先删除套餐数据
        this.removeByIds(ids);
        //          -> 再删除与之关联的菜品数据 "SetmealDish"
        LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(SetmealDish::getSetmealId,ids);
        setMealDishService.remove(wrapper); // 删除套餐关系表中的菜品数据
    }

    @Override //1 修改套餐
    public SetmealDto getByIdDish(Long id) {
        //1 通过Setmeal数据表查询相应的套餐基本信息
        Setmeal byId = this.getById(id);

        //2 创建对象
        SetmealDto setmealDto = new SetmealDto();
        BeanUtils.copyProperties(byId,setmealDto);

        //3 通过setmeal_dish数据表查询出对应菜品的信息
        //  创建对象
        LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
        //  添加查询条件
        queryWrapper.eq(SetmealDish::getDishId,byId.getId());
        //  调用方法完成查询,通过list的方式进行展示
        List<SetmealDish> list = setMealDishService.list(queryWrapper);
        //  封装结果并返回
        setmealDto.setSetmealDishes(list);
        return setmealDto;
    }

    @Override //2修改套餐
    @Transactional
    public void updateDish(SetmealDto setmealDto) {
        //1 对Setmeal数据表的信息进行更新
        this.updateById(setmealDto);

        //2 清理Setmeal_dish数据表的套餐菜品信息
        //  创建条件构造器
        LambdaQueryWrapper<SetmealDish> wrapper = new LambdaQueryWrapper<>();
        //  添加查询条件
        wrapper.eq(SetmealDish::getDishId,setmealDto.getId());
        //  调用方法进行删除
        setMealDishService.remove(wrapper);

        //3 在Setmeal_dish数据表中添加新的套餐菜品信息
        List<SetmealDish> setMealDishes = setmealDto.getSetmealDishes();
        setMealDishes = setMealDishes.stream().map((item)->{
            item.setSetmealId(setmealDto.getId());
            return item;
        }).collect(Collectors.toList());
        //  对数据结果进行封装
        setMealDishService.saveBatch(setMealDishes);
    }

}
